// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.client.utils; import com.google.appinventor.shared.rpc.UploadResponse; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FileUpload; import com.google.gwt.user.client.ui.FormHandler; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.FormSubmitCompleteEvent; import com.google.gwt.user.client.ui.FormSubmitEvent; import com.google.gwt.user.client.ui.RootPanel; /** * Utility class to upload files to the server. * */ public final class Uploader { // Singleton Uploader instance public static final Uploader INSTANCE = new Uploader(); // Uploader form private final FormPanel form; // Callback upon completion of upload private AsyncCallback<UploadResponse> callback; /** * Returns the uploader instance. * * @return uploader instance */ public static Uploader getInstance() { return INSTANCE; } /** * Creates a new uploader. */ private Uploader() { // Because we're going to add a FileUpload widget, we'll need to set the // form to use the POST method, and multipart MIME encoding. form = new FormPanel(); form.setEncoding(FormPanel.ENCODING_MULTIPART); form.setMethod(FormPanel.METHOD_POST); form.setSize("0px", "0px"); form.setVisible(false); // Add an event handler to the form. form.addFormHandler(new FormHandler() { @Override public void onSubmit(FormSubmitEvent event) { // nothing } @Override public void onSubmitComplete(FormSubmitCompleteEvent event) { // When the form submission is successfully completed, this event is // fired. Assuming the service returned a response of type text/html, // we can get the result text here (see the FormPanel documentation for // further explanation). String results = event.getResults(); // If the submit completely failed, results will be null. if (results == null) { callback.onFailure(new RuntimeException("Upload error")); } else { // results contains the UploadResponse value as a String. It was written on the server // side in the doPost method in ode/server/UploadServlet.java. UploadResponse uploadResponse = UploadResponse.extractUploadResponse(results); if (uploadResponse != null) { callback.onSuccess(uploadResponse); } else { callback.onFailure(new RuntimeException("Upload error")); } } } }); RootPanel.get().add(form); } /** * Uploads the given file. * * @param upload file upload widget containing file information * @param uploadUrl URL to upload the file to */ public final void upload(FileUpload upload, String uploadUrl, AsyncCallback<UploadResponse> callback) { this.callback = callback; form.setWidget(upload); form.setAction(uploadUrl); form.submit(); } }